marin %$%
  plot_ly(x = x, y = y, z = z) %>%  
  add_surface() 
d %>% 
  ggplot(aes(x=x,y=y)) + 
  stat_density_2d(aes(fill = ..level..), geom = 'polygon') +
  geom_segment(aes(x = 8.75, y = 10, xend = 9.5, yend = 10), size = 1.5) + 
  geom_text(aes(x = 10, y = 10), label = 'North', angle = 270, size = 5) +
  scale_y_continuous(limits = c(0, 90)) + 
  labs(title = 'Functional Headlands') + 
  theme_minimal() + 
  theme(legend.position = 'none')

# ggsave(
#   filename = './images/marin_density.pdf',
#   device = 'pdf', bg = 'transparent')
d %>% 
  ggplot(aes(x=x,y=y)) + 
  geom_density_2d() +
  scale_y_continuous(limits = c(0, 90)) + 
  geom_segment(aes(x = 8.75, y = 10, xend = 9.5, yend = 10), size = 1.5) + 
  geom_text(aes(x = 10, y = 10), label = 'North', angle = 270, size = 5) +
  labs(
    title = 'Functional Headlands'
  ) + 
  theme_minimal()

# ggsave(
#   filename = './images/marin_contour.pdf', 
#   device = 'pdf', bg = 'transparent')
d %>% 
  ggplot(aes(x=x,y=y)) + 
  geom_density_2d() +
  geom_segment(
    aes(x = 0, xend = 10, y = (-200/30), yend = (-200/30) + 80),
    size = 2, color = 'darkorange') +
  stat_function(
    fun = function(x) 10 - 2*x + x^2, xlim = c(0,10), 
    size = 2, color = 'steelblue') +  
  geom_segment(aes(x = 8.75, y = 10, xend = 9.5, yend = 10), size = 1.5) + 
  geom_text(aes(x = 10, y = 10), label = 'North', angle = 270, size = 5) +
  labs(
    title = 'Functional Headlands'
  ) + 
  theme_minimal()

# ggsave(
#   filename = './images/marin_contour_highest_prob.pdf', 
#   device = 'pdf', bg = 'transparent')
y <- seq(9, 90, by = 0.1)
Fy <- .1 * sqrt(y-9) + .1
ecdf_y <- ecdf(sample(d$y, size = 20, replace = TRUE))

plot(
  ecdf_y, 
  main = 'CDF and Empirical CDF',
  col = 'steelblue')
lines(x=y, y=Fy, col = 'darkorange')

Student Example

x <- seq(0,2,.01)
fx <- .5*x

More complexity

d <- data.frame(
  id = 1:10000,
  x = c(
    runif(n=5000, min = 0, max = 10),
    runif(n=5000, min = 5, max = 15)
    ), 
  w = rnorm(n = 10000, mean = 0, sd = 3)
  )
d <- d %>%  
  mutate(
    y = ifelse(
      id <= 5000, 
      10 - 2*x + x**2 + w,
      -10 + 20*x - (x - 5)**2 + w
      ))
complex_marin <- d %$% 
  kde2d(x = x, y = y, n = 500)
complex_marin %$%
  plot_ly(x = x, y = y, z = z) %>%  
  add_surface() 
d %>% 
  filter(id %in% sample(1:n(), size = 100)) %$%
  kde2d(x=x,y=y, n=100) %$%
  plot_ly(x=x,y=y,z=z) %>%  
  add_surface()
complex_marin %>% 
  plot_ly(x=x, y=y, z=z) %>%  
  add_markers()
Error: First argument, `data`, must be a data frame or shared data.
l <- data.frame(
  lowess(d$x, d$y, f = .05)
)

d %>% 
  ggplot() + 
  geom_density_2d(aes(x=x,y=y)) + 
  geom_point(data = l, aes(x=x, y=y))

NA
NA
LS0tCnRpdGxlOiAiTWFyaW4gRWxldmF0aW9uIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpgYGB7ciBsb2FkIHBhY2thZ2VzLCBpbmNsdWRlID0gRkFMU0V9CmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KG1hZ3JpdHRyKQpsaWJyYXJ5KE1BU1MpCmxpYnJhcnkoZHBseXIpCmBgYAoKCmBgYHtyIG1ha2UgZGF0YSwgaW5jbHVkZSA9IEZBTFNFfQpkIDwtIGRhdGEuZnJhbWUoCiAgeCA9IHJ1bmlmKG49NTAwMCwgbWluID0gMCwgbWF4ID0gMTApLAogIHcgPSBybm9ybShuID0gNTAwMCwgbWVhbiA9IDAsIHNkID0gMykKICApICU+JSAgCiAgbXV0YXRlKAogICAgeSA9IDEwIC0gMip4ICsgeCoqMgogICkKYGBgCgpgYGB7ciBoZWxwZXIgdG8gbWFrZSBzdXJmYWNlIG9mIHBsb3QsIGluY2x1ZGUgPSBGQUxTRX0gCm1hcmluIDwtIGQgJSQlIAogIGtkZTJkKHggPSB4LCB5ID0geSwgbiA9IDEwMCkKYGBgCgpgYGB7ciBtYWtlIHBsb3QsIGVjbm8gPSBGQUxTRX0KbWFyaW4gJSQlCiAgcGxvdF9seSh4ID0geCwgeSA9IHksIHogPSB6KSAlPiUgIAogIGFkZF9zdXJmYWNlKCkgCmBgYAoKYGBge3J9CiMgZCAlPiUgCiMgICBnZ3Bsb3QoYWVzKHg9eCx5PXkpKSArIAojICAgc3RhdF9kZW5zaXR5XzJkKGFlcyhmaWxsID0gLi5sZXZlbC4uKSwgZ2VvbSA9ICdwb2x5Z29uJykgKwojICAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gOC43NSwgeSA9IDEwLCB4ZW5kID0gOS41LCB5ZW5kID0gMTApLCBzaXplID0gMS41KSArIAojICAgZ2VvbV90ZXh0KGFlcyh4ID0gMTAsIHkgPSAxMCksIGxhYmVsID0gJ05vcnRoJywgYW5nbGUgPSAyNzAsIHNpemUgPSA1KSArCiMgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCA5MCkpICsgCiMgICBsYWJzKHRpdGxlID0gJ0Z1bmN0aW9uYWwgSGVhZGxhbmRzJykgKyAKIyAgIHRoZW1lX21pbmltYWwoKSArIAojICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnKQojIGdnc2F2ZSgKIyAgIGZpbGVuYW1lID0gJy4vaW1hZ2VzL21hcmluX2RlbnNpdHkucGRmJywKIyAgIGRldmljZSA9ICdwZGYnLCBiZyA9ICd0cmFuc3BhcmVudCcpCmBgYAoKYGBge3J9CmQgJT4lIAogIGdncGxvdChhZXMoeD14LHk9eSkpICsgCiAgZ2VvbV9kZW5zaXR5XzJkKCkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDkwKSkgKyAKICBnZW9tX3NlZ21lbnQoYWVzKHggPSA4Ljc1LCB5ID0gMTAsIHhlbmQgPSA5LjUsIHllbmQgPSAxMCksIHNpemUgPSAxLjUpICsgCiAgZ2VvbV90ZXh0KGFlcyh4ID0gMTAsIHkgPSAxMCksIGxhYmVsID0gJ05vcnRoJywgYW5nbGUgPSAyNzAsIHNpemUgPSA1KSArCiAgbGFicygKICAgIHRpdGxlID0gJ0Z1bmN0aW9uYWwgSGVhZGxhbmRzJwogICkgKyAKICB0aGVtZV9taW5pbWFsKCkKIyBnZ3NhdmUoCiMgICBmaWxlbmFtZSA9ICcuL2ltYWdlcy9tYXJpbl9jb250b3VyLnBkZicsIAojICAgZGV2aWNlID0gJ3BkZicsIGJnID0gJ3RyYW5zcGFyZW50JykKYGBgCgoKYGBge3J9CmQgJT4lIAogIGdncGxvdChhZXMoeD14LHk9eSkpICsgCiAgZ2VvbV9kZW5zaXR5XzJkKCkgKwogIGdlb21fc2VnbWVudCgKICAgIGFlcyh4ID0gMCwgeGVuZCA9IDEwLCB5ID0gKC0yMDAvMzApLCB5ZW5kID0gKC0yMDAvMzApICsgODApLAogICAgc2l6ZSA9IDIsIGNvbG9yID0gJ2RhcmtvcmFuZ2UnKSArCiAgc3RhdF9mdW5jdGlvbigKICAgIGZ1biA9IGZ1bmN0aW9uKHgpIDEwIC0gMip4ICsgeF4yLCB4bGltID0gYygwLDEwKSwgCiAgICBzaXplID0gMiwgY29sb3IgPSAnc3RlZWxibHVlJykgKyAgCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gOC43NSwgeSA9IDEwLCB4ZW5kID0gOS41LCB5ZW5kID0gMTApLCBzaXplID0gMS41KSArIAogIGdlb21fdGV4dChhZXMoeCA9IDEwLCB5ID0gMTApLCBsYWJlbCA9ICdOb3J0aCcsIGFuZ2xlID0gMjcwLCBzaXplID0gNSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICdGdW5jdGlvbmFsIEhlYWRsYW5kcycKICApICsgCiAgdGhlbWVfbWluaW1hbCgpCiMgZ2dzYXZlKAojICAgZmlsZW5hbWUgPSAnLi9pbWFnZXMvbWFyaW5fY29udG91cl9oaWdoZXN0X3Byb2IucGRmJywgCiMgICBkZXZpY2UgPSAncGRmJywgYmcgPSAndHJhbnNwYXJlbnQnKQpgYGAKCgoKYGBge3J9CnkgPC0gc2VxKDksIDkwLCBieSA9IDAuMSkKRnkgPC0gLjEgKiBzcXJ0KHktOSkgKyAuMQplY2RmX3kgPC0gZWNkZihzYW1wbGUoZCR5LCBzaXplID0gMjAsIHJlcGxhY2UgPSBUUlVFKSkKCnBsb3QoCiAgZWNkZl95LCAKICBtYWluID0gJ0NERiBhbmQgRW1waXJpY2FsIENERicsCiAgY29sID0gJ3N0ZWVsYmx1ZScpCmxpbmVzKHg9eSwgeT1GeSwgY29sID0gJ2RhcmtvcmFuZ2UnKQpgYGAKCiMgU3R1ZGVudCBFeGFtcGxlIAoKYGBge3J9CnggPC0gc2VxKDAsMiwuMDEpCmZ4IDwtIC41KngKYGBgCgojIE1vcmUgY29tcGxleGl0eSAKCmBgYHtyfQpkIDwtIGRhdGEuZnJhbWUoCiAgaWQgPSAxOjEwMDAwLAogIHggPSBjKAogICAgcnVuaWYobj01MDAwLCBtaW4gPSAwLCBtYXggPSAxMCksCiAgICBydW5pZihuPTUwMDAsIG1pbiA9IDUsIG1heCA9IDE1KQogICAgKSwgCiAgdyA9IHJub3JtKG4gPSAxMDAwMCwgbWVhbiA9IDAsIHNkID0gMykKICApCmBgYAoKCmBgYHtyfQpkIDwtIGQgJT4lICAKICBtdXRhdGUoCiAgICB5ID0gaWZlbHNlKAogICAgICBpZCA8PSA1MDAwLCAKICAgICAgMTAgLSAyKnggKyB4KioyICsgdywKICAgICAgLTEwICsgMjAqeCAtICh4IC0gNSkqKjIgKyB3CiAgICAgICkpCmBgYAoKYGBge3J9CmNvbXBsZXhfbWFyaW4gPC0gZCAlJCUgCiAga2RlMmQoeCA9IHgsIHkgPSB5LCBuID0gNTAwKQpjb21wbGV4X21hcmluICUkJQogIHBsb3RfbHkoeCA9IHgsIHkgPSB5LCB6ID0geikgJT4lICAKICBhZGRfc3VyZmFjZSgpIApgYGAKCmBgYHtyfQpkICU+JSAKICBmaWx0ZXIoaWQgJWluJSBzYW1wbGUoMTpuKCksIHNpemUgPSAxMDApKSAlJCUKICBrZGUyZCh4PXgseT15LCBuPTEwMCkgJSQlCiAgcGxvdF9seSh4PXgseT15LHo9eikgJT4lICAKICBhZGRfc3VyZmFjZSgpCmBgYAoKCmBgYHtyfQpjb21wbGV4X21hcmluICU+JSAKICBwbG90X2x5KHg9eCwgeT15LCB6PXopICU+JSAgCiAgYWRkX21hcmtlcnMoKQogIApgYGAKCgpgYGB7cn0KbCA8LSBkYXRhLmZyYW1lKAogIGxvd2VzcyhkJHgsIGQkeSwgZiA9IC4wNSkKKQoKZCAlPiUgCiAgZ2dwbG90KCkgKyAKICBnZW9tX2RlbnNpdHlfMmQoYWVzKHg9eCx5PXkpKSArIAogIGdlb21fcG9pbnQoZGF0YSA9IGwsIGFlcyh4PXgsIHk9eSkpCgoKYGBgCgo=